// Package router 定义了应用的路由配置。
// 该文件设置了 API 路由分组和中间件。
package router

import (
	"exchangeapp/controllers"
	"exchangeapp/middlewares"
	"time"

	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
)

// SetupRouter 配置应用的路由。
// 返回值：
//   - *gin.Engine: 配置完成的 Gin 路由引擎实例。
func SetupRouter() *gin.Engine {
	r := gin.Default()

	// 配置跨域资源共享 (CORS) 中间件(Use函数配置中间件)。
	r.Use(cors.New(cors.Config{
		AllowOrigins:     []string{"*"},                                                // 允许所有来源。
		AllowMethods:     []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"}, // 允许的 HTTP 方法。
		AllowHeaders:     []string{"*"},                                                // 允许的请求头。
		ExposeHeaders:    []string{"Content-Length", "Content-Type", "Authorization"},  // 暴露的响应头。
		AllowCredentials: true,                                                         // 是否允许发送凭据。
		MaxAge:           12 * time.Hour,                                               // 预检请求的缓存时间。
	}))

	// 配置认证相关的路由分组。
	auth := r.Group("/api/auth")
	{
		auth.POST("/login", controllers.Login)       // 登录接口。
		auth.POST("/register", controllers.Register) // 注册接口。
	}

	// 配置 API 路由分组。
	api := r.Group("/api")
	api.GET("/exchangeRates", controllers.GetExchangeRates) // 获取汇率的接口，无需登录。
	api.Use(middlewares.AuthMiddleWare())                   // 使用中间件验证 JWT。
	{
		api.POST("/exchangeRates", controllers.CreateExchangeRate) // 更新汇率的接口，需要登录。

		api.POST("/articles", controllers.CreateArticle)     // 创建文章的接口。
		api.GET("/articles", controllers.GetArticles)        // 获取文章列表的接口。
		api.GET("/articles/:id", controllers.GetArticleByID) // 根据 ID 获取文章的接口。(正确URL中只有参数值,不应加上冒号,冒号只是gin的标识,/articles/1)

		api.POST("/articles/:id/like", controllers.LikeArticle)    // 点赞文章的接口。
		api.GET("/articles/:id/like", controllers.GetArticleLikes) // 获取文章点赞数的接口。
	}

	return r
}
